#include "stm32f10x.h"        // Device header
uint16_t Count;
void CountSensor_Init(void){
	//EXTI基本结构：GPIOA——AFIO——EXTI——NVIC
	//1.配置RCC
	//2.配置GPIO，选择端口为输入模式
	//3.配置AFIO，选择我们用的GPIO，连接后面的EXTI
	//4.配置EXTI，选择边沿触发方式，比如上升沿、下降沿或双边沿
	//5.配置NVIC，给我们中断选择一个合适的优先级
	//最后，通过NVIC，外部中断进入CPU
	//1
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//注意APB2与APB1的总线
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	//不需要配置EXTI,NVIC(内核的外设均不需要)的时钟
	
	//2
	GPIO_InitTypeDef GPIO_InitStructure;
	//具体要什么模式，可以去参考手册中的GPIO的8.1.11 外设GPIO配置
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉，默认高电平
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	
	//3配置AFIO的输入断引脚选择，输出端固定到EXTI电路
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
	
	//4 配置EXTI
	EXTI_InitTypeDef EXTI_InitStructure;
	EXTI_InitStructure.EXTI_Line=EXTI_Line14; //配置EXTI的第14个线路为中断模式
	EXTI_InitStructure.EXTI_LineCmd=ENABLE;  //开启中断，使PB14的电平信号通过EXTI通向下一级NVIC
	EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
	//EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling;  //双边沿触发
	EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
	EXTI_Init(&EXTI_InitStructure);
	//5 配置NVIC，由于NVIC为内核外设，所以放到misc.h
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn; //配置通道
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //开启触发
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;  //配置抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;  //配置响应优先级
	NVIC_Init(&NVIC_InitStructure);
	
}
//要配置中断程序，中断程序在STM32中的固定的，需要去启动Start文件夹里的启动文件里找
//中断函数不需要声明，它自动会执行
void EXTI15_10_IRQHandler(void){
	//要先这个中断点是不是我们想要的EXTI14
	if(EXTI_GetFlagStatus(EXTI_Line14)==SET){//查看EXTI_Line14是不是为1，返回值是SET or RESET
		//执行中断程序
		Count++;
		//在中断程序结束后，要再调用一下清除中断标志位的函数，不然程序会不断响应中断，执行函数，最后程序卡死在中断函数
		EXTI_ClearITPendingBit(EXTI_Line14);
	}
}
//返回Count
uint16_t Get_Count(void){
	return Count;
}